{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# ArrayList Excecise\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ex1：挖雷游戏\n",
    "\n",
    "我们来写一个小程序：\n",
    "\n",
    "<img src=\"../images/ch02/mine.jpg\" width=\"200\"/> \n",
    "\n",
    "程序接收三个参数，M，N和p，然后生成一个M * N的矩阵，然后每一个cell有p的概率是地雷。生成矩阵后，再计算出每一个cell周围地雷的数量。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import random\n",
    "\n",
    "def minesweeper(m, n, p):\n",
    "    board = [[None] * (n+2) for i in range(m+2)]\n",
    "    for i in range(1, m + 1):\n",
    "        for j in range(1, n + 1):\n",
    "            r = random.random()\n",
    "            board[i][j] = -1 if r < p else 0\n",
    "\n",
    "    for i in range(1, m + 1):\n",
    "        for j in range(1, n + 1):\n",
    "            print(\"*\", end=\" \") if board[i][j] == -1 else print(\".\", end=\" \")\n",
    "        print()\n",
    "        \n",
    "    for i in range(1, m + 1):\n",
    "        for j in range(1, n + 1):\n",
    "            if (board[i][j] != -1):\n",
    "                for ii in range(i-1, i+2):\n",
    "                    for jj in range(j-1, j+2):\n",
    "                        if (board[ii][jj] == -1):\n",
    "                            board[i][j] += 1\n",
    "    \n",
    "    print()\n",
    "    for i in range(1, m + 1):\n",
    "        for j in range(1, n + 1):\n",
    "            print(\"*\", end=\" \") if board[i][j] == -1 else print(board[i][j], end=\" \")\n",
    "        print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      ". . . . * . . . . . \n",
      ". * . . . . . * . . \n",
      ". . . . . . . * . . \n",
      "* * . . . . . . . * \n",
      ". . . . . . . . . . \n",
      "\n",
      "1 1 1 1 * 1 1 1 1 0 \n",
      "1 * 1 1 1 1 2 * 2 0 \n",
      "3 3 2 0 0 0 2 * 3 1 \n",
      "* * 1 0 0 0 1 1 2 * \n",
      "2 2 1 0 0 0 0 0 1 1 \n"
     ]
    }
   ],
   "source": [
    "minesweeper(5, 10, 0.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ex2：矩阵0变换\n",
    "给一个m×n的矩阵，如果有一个元素为0，则把该元素对应的行与列所有元素全部变成0。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# O(m+n) space complexity\n",
    "def zero(matrix):\n",
    "    m = [None] * len(matrix)\n",
    "    n = [None] * len(matrix[0])\n",
    "    for i in range(len(matrix)):\n",
    "        for j in range(len(matrix[0])):\n",
    "            if (matrix[i][j] == 0):\n",
    "                m[i] = 1\n",
    "                n[j] = 1\n",
    "                \n",
    "    for i in range(len(matrix)):\n",
    "        for j in range(len(matrix[0])):\n",
    "            if (m[i] == 1 or n[j] == 1):\n",
    "                matrix[i][j] = 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "matrix = [  [ 1, 1, 1, 1, 1, 0, 1, 1, 1, 1 ],\n",
    "            [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],\n",
    "            [ 1, 1, 0, 1, 1, 1, 1, 1, 1, 1 ],\n",
    "            [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],\n",
    "            [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ] ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, 1, 1, 1, 1, 0, 1, 1, 1, 1]\n",
      "[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n",
      "[1, 1, 0, 1, 1, 1, 1, 1, 1, 1]\n",
      "[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n",
      "[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n"
     ]
    }
   ],
   "source": [
    "for x in matrix:\n",
    "    print(x, sep=\" \")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n",
      "[1, 1, 0, 1, 1, 0, 1, 1, 1, 1]\n",
      "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n",
      "[1, 1, 0, 1, 1, 0, 1, 1, 1, 1]\n",
      "[1, 1, 0, 1, 1, 0, 1, 1, 1, 1]\n"
     ]
    }
   ],
   "source": [
    "zero(matrix)\n",
    "for x in matrix:\n",
    "    print(x, sep=\" \")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ex3：九宫图\n",
    "<img src=\"../images/ch02/magicsquare.jpg\" width=\"100\"/> "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def magic_square(n):\n",
    "    magic = [[0] * (n) for i in range(n)]\n",
    "    row = n - 1\n",
    "    col = n//2\n",
    "    magic[row][col] = 1\n",
    "    \n",
    "    for i in range(2, n * n + 1):\n",
    "        try_row = (row + 1) % n\n",
    "        try_col = (col + 1) % n\n",
    "\n",
    "        if (magic[try_row][try_col] == 0):\n",
    "            row = try_row\n",
    "            col = try_col\n",
    "        else:\n",
    "            row = (row - 1 + n) % n\n",
    "        \n",
    "        magic[row][col] = i\n",
    "    \n",
    "    for x in magic:\n",
    "        print(x, sep=\" \")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[4, 9, 2]\n",
      "[3, 5, 7]\n",
      "[8, 1, 6]\n"
     ]
    }
   ],
   "source": [
    "magic_square(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[11, 18, 25, 2, 9]\n",
      "[10, 12, 19, 21, 3]\n",
      "[4, 6, 13, 20, 22]\n",
      "[23, 5, 7, 14, 16]\n",
      "[17, 24, 1, 8, 15]\n"
     ]
    }
   ],
   "source": [
    "magic_square(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ex4：数独\n",
    "<img src=\"../images/ch02/sudoku.jpg\" width=\"200\"/> \n",
    "给一个填好的数独，验证是否正确。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "matrix = [\n",
    "    [5,3,4,6,7,8,9,1,2],\n",
    "    [6,7,2,1,9,5,3,4,8],\n",
    "    [1,9,8,3,4,2,5,6,7],\n",
    "    [8,5,9,7,6,1,4,2,3],\n",
    "    [4,2,6,8,5,3,7,9,1],\n",
    "    [7,1,3,9,2,4,8,5,6],\n",
    "    [9,6,1,5,3,7,2,8,4],\n",
    "    [2,8,7,4,1,9,6,3,5],\n",
    "    [3,4,5,2,8,6,1,7,9]\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def sudoku(matrix):\n",
    "    n = len(matrix)\n",
    "    result_row = result_col = result_blk = 0\n",
    "\n",
    "    for i in range(n):\n",
    "        result_row = result_col = result_blk = 0\n",
    "        for j in range(n):\n",
    "            ## check row\n",
    "            tmp = matrix[i][j]\n",
    "            if ((result_row & (1 << (tmp-1))) == 0):\n",
    "                result_row = result_row | (1<<(tmp-1))\n",
    "            else:\n",
    "                print(\"row: \", i, j)\n",
    "                return False\n",
    "\n",
    "            ## check column\n",
    "            tmp = matrix[j][i]\n",
    "            if ((result_col & (1 << (tmp-1))) == 0):\n",
    "                result_col = result_col | (1<<(tmp-1))\n",
    "            else:\n",
    "                print(\"col: \", j, i)\n",
    "                return False\n",
    "\n",
    "            ## check block\n",
    "            idx_row = (i//3) * 3 + j//3\n",
    "            idx_col = (i%3)  * 3 + j%3\n",
    "            tmp = matrix[idx_row][idx_col]\n",
    "            if ((result_blk & (1 << (tmp-1))) == 0):\n",
    "                result_blk = result_blk | (1<<(tmp-1))\n",
    "            else:\n",
    "                print(\"block: \", idx_row, idx_col)\n",
    "                return False\n",
    "    return True"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sudoku(matrix)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ex5：旋转数组\n",
    "给一个n×n的数组，旋转90度。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def rotate(matrix):\n",
    "    n = len(matrix)\n",
    "    result = [[0] * (n) for i in range(n)]\n",
    "    \n",
    "    for i in range(n):\n",
    "        for j in range(n):\n",
    "            result[j][n-1-i] = matrix[i][j]\n",
    "    \n",
    "    for x in result:\n",
    "        print(x, sep=\" \")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[[0, 1, 2, 3, 4],\n",
       " [5, 6, 7, 8, 9],\n",
       " [10, 11, 12, 13, 14],\n",
       " [15, 16, 17, 18, 19],\n",
       " [20, 21, 22, 23, 24]]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "matrix = [[i*5+j for j in range(5)] for i in range(5)]\n",
    "matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[20, 15, 10, 5, 0]\n",
      "[21, 16, 11, 6, 1]\n",
      "[22, 17, 12, 7, 2]\n",
      "[23, 18, 13, 8, 3]\n",
      "[24, 19, 14, 9, 4]\n"
     ]
    }
   ],
   "source": [
    "rotate(matrix)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 173,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# in-place\n",
    "\n",
    "def rotate_in_place(matrix):\n",
    "    n = len(matrix)\n",
    "    for layer in range(n//2):\n",
    "        first = layer\n",
    "        last = n - 1 - layer\n",
    "        for i in range(first, last):\n",
    "            offset = i - first\n",
    "            top = matrix[first][i]  # save top\n",
    "            \n",
    "            ## left->top\n",
    "            matrix[first][i] = matrix[last-offset][first]\n",
    "            \n",
    "            ##bottom -> left\n",
    "            matrix[last-offset][first] = matrix[last][last - offset];\n",
    "\n",
    "            # right -> bottom\n",
    "            matrix[last][last - offset] = matrix[i][last];\n",
    "\n",
    "            # top -> right\n",
    "            matrix[i][last] = top;  # right <- saved top            \n",
    "            \n",
    "    for x in matrix:\n",
    "        print(x, sep=\" \")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 175,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[20, 15, 10, 5, 0]\n",
      "[21, 16, 11, 6, 1]\n",
      "[22, 17, 12, 7, 2]\n",
      "[23, 18, 13, 8, 3]\n",
      "[24, 19, 14, 9, 4]\n"
     ]
    }
   ],
   "source": [
    "matrix = [[i*5+j for j in range(5)] for i in range(5)]\n",
    "rotate(matrix)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ex6：反转字符串\n",
    "hello => olleh"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def reverse(s):\n",
    "    return s[::-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'olleh'"
      ]
     },
     "execution_count": 177,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s = \"hello\"\n",
    "r = reverse(s) # O(n)\n",
    "r"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def reverse2(s):\n",
    "    l = list(s)\n",
    "    for i in range(len(l)//2):\n",
    "        l[i], l[len(s)-1-i] = l[len(s)-1-i], l[i]\n",
    "    return ''.join(l)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 183,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'olleh'"
      ]
     },
     "execution_count": 183,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s = \"hello\"\n",
    "r = reverse2(s)\n",
    "r"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def reverse2(s):\n",
    "    l = list(s)\n",
    "    begin, end = 0, len(l) - 1\n",
    "    while begin <= end\n",
    "        l[begin], l[end] = l[end], l[i]\n",
    "    return ''.join(l)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ex7：最长连续子串\n",
    "给一个只包含0和1的数组，找出最长的全是1的子数组。\n",
    "\n",
    "Example:\n",
    "\n",
    "Input: [1,1,0,1,1,1]\n",
    "\n",
    "Output: 3\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def find_consecutive_ones(nums):\n",
    "    local = maximum = 0\n",
    "    for i in nums:\n",
    "        local = local + 1 if i == 1 else 0\n",
    "        maximum = max(maximum, local)\n",
    "    return maximum"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nums = [1,1,0,1,1,1,1,0,0,0,0,0,1,1,1,0,0,1]\n",
    "result = find_consecutive_ones(nums)\n",
    "result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ex8：最大数\n",
    "给定一个数组，数组里有一个数组有且只有一个最大数，判断这个最大数是否是其他数的两倍或更大。如果存在这个数，则返回其index，否则返回-1。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# O(n) time\n",
    "# O(1) space\n",
    "def largest_twice(nums):\n",
    "    maximum = second = idx = 0\n",
    "    for i in range(len(nums)):\n",
    "        if (maximum < nums[i]):\n",
    "            second = maximum\n",
    "            maximum = nums[i]\n",
    "            idx = i\n",
    "        elif second < nums[i]:\n",
    "            second = nums[i]\n",
    "    return idx if (maximum >= second * 2) else -1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nums = [1, 2,3,8,3,2,1]\n",
    "result = largest_twice(nums)\n",
    "result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ex9：Find All Numbers Disappeared in an Array\n",
    "\n",
    "\n",
    "Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.\n",
    "\n",
    "Find all the elements of [1, n] inclusive that do not appear in this array.\n",
    "\n",
    "Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.\n",
    "\n",
    "Example:\n",
    "\n",
    "Input: [4,3,2,7,8,2,3,1] \n",
    "\n",
    "Output: [5,6] "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# O(n^2)\n",
    "def findDisappearedNumbers1(nums):\n",
    "    result = []\n",
    "    for i in range(1, len(nums) + 1):\n",
    "        if (i not in nums):\n",
    "            result.append(i)\n",
    "    return result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[5, 6]\n"
     ]
    }
   ],
   "source": [
    "nums = [4,3,2,7,8,2,3,1]\n",
    "print(findDisappearedNumbers1(nums))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def findDisappearedNumbersTest1(nums):\n",
    "    start = time.time()\n",
    "    r = findDisappearedNumbers1(nums)\n",
    "    t = time.time() - start\n",
    "    return r, len(nums), t"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import time\n",
    "import matplotlib.pyplot as plt\n",
    "import random\n",
    "import math\n",
    "%matplotlib inline  \n",
    "\n",
    "def random_list(l):\n",
    "    return [[i + 1 for i in range(l * n)] for n in range(1, 20)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[([], 100, 0.0),\n",
       " ([], 200, 0.0),\n",
       " ([], 300, 0.0009999275207519531),\n",
       " ([], 400, 0.002000093460083008),\n",
       " ([], 500, 0.0029997825622558594),\n",
       " ([], 600, 0.00500035285949707),\n",
       " ([], 700, 0.004999876022338867),\n",
       " ([], 800, 0.0069997310638427734),\n",
       " ([], 900, 0.020000219345092773),\n",
       " ([], 1000, 0.011999845504760742),\n",
       " ([], 1100, 0.014000177383422852),\n",
       " ([], 1200, 0.02200007438659668),\n",
       " ([], 1300, 0.023999929428100586),\n",
       " ([], 1400, 0.02500009536743164),\n",
       " ([], 1500, 0.031999826431274414),\n",
       " ([], 1600, 0.034999847412109375),\n",
       " ([], 1700, 0.0410001277923584),\n",
       " ([], 1800, 0.04999995231628418),\n",
       " ([], 1900, 0.051000118255615234)]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "random_lists = random_list(100)\n",
    "rst = [findDisappearedNumbersTest1(l) for l in random_lists]\n",
    "len(rst)\n",
    "rst"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7b5eda0>]"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nIiJx5v8DHId5UVD/p4gAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7a21e10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = list(zip(*rst))[1]\n",
    "y = list(zip(*rst))[2]\n",
    "\n",
    "plt.plot(x, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def findDisappearedNumbers2(nums):\n",
    "    # For each number i in nums,\n",
    "    # we mark the number that i points as negative.\n",
    "    # Then we filter the list, get all the indexes\n",
    "    # who points to a positive number\n",
    "    for i in range(len(nums)):\n",
    "        index = abs(nums[i]) - 1\n",
    "        nums[index] = - abs(nums[index])\n",
    "\n",
    "    return [i + 1 for i in range(len(nums)) if nums[i] > 0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[5, 6]\n"
     ]
    }
   ],
   "source": [
    "nums = [4,3,2,7,8,2,3,1]\n",
    "print(findDisappearedNumbers2(nums))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# O(n)\n",
    "def findDisappearedNumbersTest2(nums):\n",
    "    start = time.time()\n",
    "    r = findDisappearedNumbers2(nums)\n",
    "    t = time.time() - start\n",
    "    return r, len(nums), t"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[([], 100, 0.0),\n",
       " ([], 200, 0.0),\n",
       " ([], 300, 0.0),\n",
       " ([], 400, 0.0),\n",
       " ([], 500, 0.0009999275207519531),\n",
       " ([], 600, 0.0010001659393310547),\n",
       " ([], 700, 0.0009999275207519531),\n",
       " ([], 800, 0.0),\n",
       " ([], 900, 0.01399993896484375),\n",
       " ([], 1000, 0.0),\n",
       " ([], 1100, 0.0010001659393310547),\n",
       " ([], 1200, 0.0009999275207519531),\n",
       " ([], 1300, 0.0),\n",
       " ([], 1400, 0.0009999275207519531),\n",
       " ([], 1500, 0.0010001659393310547),\n",
       " ([], 1600, 0.0009999275207519531),\n",
       " ([], 1700, 0.0009999275207519531),\n",
       " ([], 1800, 0.0019998550415039062),\n",
       " ([], 1900, 0.0010004043579101562)]"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "random_lists = random_list(100)\n",
    "rst = [findDisappearedNumbersTest2(l) for l in random_lists]\n",
    "len(rst)\n",
    "rst"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x530375f8>]"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nUABu1EgAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x5278e978>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = list(zip(*rst))[1]\n",
    "y = list(zip(*rst))[2]\n",
    "\n",
    "plt.plot(x, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ex10：Plus One\n",
    "\n",
    "Given a non-negative integer represented as a non-empty array of digits, plus one to the integer.\n",
    "\n",
    "You may assume the integer do not contain any leading zero, except the number 0 itself.\n",
    "\n",
    "The digits are stored such that the most significant digit is at the head of the list.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def plusOne(digits):\n",
    "    if len(digits)==0:\n",
    "        return False\n",
    "    addCarry=1\n",
    "    for i in range(len(digits)-1,-1,-1):\n",
    "        digits[i]+=addCarry\n",
    "        if digits[i]==10:\n",
    "            digits[i]=0\n",
    "            if i==0:\n",
    "                digits.insert(0,1)\n",
    "        else:\n",
    "            break\n",
    "    return digits"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, 2, 4]\n",
      "[1, 0, 0, 0]\n"
     ]
    }
   ],
   "source": [
    "digits = [1, 2, 3]\n",
    "print(plusOne(digits))\n",
    "digits = [9, 9, 9]\n",
    "print(plusOne(digits))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
